home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSWIN / mswin.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  5KB  |  257 lines

  1. /* --------------------------------- mswin.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* general system-specific stuff for Microsoft WINDOWS.
  8.  * Windows support by Michael Taylor miket@canb.auug.org.au
  9. */
  10.  
  11. #define STRICT
  12. #include <windows.h>
  13. #include <toolhelp.h>
  14.  
  15. #include "fly.h"
  16.  
  17. /* define USETOOLHELP if MS ever fox WinG to work with it! */
  18.  
  19. HANDLE        Fly8Instance;
  20. char        FAR Fly8AppName[10]  = "Fly8";
  21. char        FAR Fly8Message[15]  = "Fly8";
  22.  
  23. static FARPROC    procInst;
  24. static char    _Gbuf[1024];
  25.  
  26. #if USETOOLHELP
  27. WORD __export _cdecl
  28. FaultHandler(WORD wES, WORD wDS, WORD wDI, WORD wSI, 
  29.         WORD wBP, WORD wSP, WORD wBX, WORD wDX, WORD wCX, WORD wOldAX, 
  30.         WORD wOldBP, WORD wRetIP, WORD wRetCS, WORD wRealAX,
  31.         WORD wNumber, WORD wHandle, WORD wIP, WORD wCS, WORD wFlags)
  32. {
  33.     static WORD wReentry;
  34.  
  35. /* See if we're already here.  If so, tell routine to chain on
  36. */
  37.     if (wReentry)
  38.         return 2;
  39.     wReentry = 1;
  40.  
  41. /* If this was a CtlAltSysRq interrupt, just restart the instr.
  42. */
  43.     if (wNumber == INT_CTLALTSYSRQ) {
  44.         wsprintf(_Gbuf, "CtlAltSysRq at %04X:%04X\r\n", wCS, wIP);
  45.         LogPrintf (_Gbuf);
  46.         wReentry = 0;
  47.         return 1;
  48.     }
  49.     if (wNumber == INT_DIV0) {
  50.         wsprintf (_Gbuf, "integer divide by zero at %04X:%04X\n", 
  51.                         wCS, wIP);
  52.         LogPrintf (_Gbuf);
  53.     } else {
  54.         wsprintf (_Gbuf, "Interrupt %d at %04X:%04X\n", 
  55.                         wNumber, wCS, wIP);
  56.         LogPrintf (_Gbuf);
  57.     }
  58.     LogPrintf ("Fly8 terminating...\n");
  59.  
  60. /* We're getting out now, so undo reentry flag
  61. */
  62.     wReentry = 0;
  63. #if 0
  64.     TerminateApp (NULL, NO_UAE_BOX);
  65. #endif
  66.     die ();     /* do as it says ... exits gracefully */
  67.     return (0);
  68. }
  69. #endif
  70.  
  71. static int FAR
  72. init (void)
  73. {
  74. #if USETOOLHELP
  75.     procInst = MakeProcInstance ((FARPROC)FaultHandler, Fly8Instance);
  76.     if (!InterruptRegister (NULL, procInst))
  77.         MessageBox((HWND)NULL, (LPCSTR)"Unable to set div by zero trap",
  78.                        (LPCSTR)"Fly8 Message", MB_OK);
  79.     SetErrorMode (SEM_FAILCRITICALERRORS);
  80. #endif
  81.  
  82.     return (0);
  83. }
  84.  
  85. static void FAR
  86. term (void)
  87. {
  88. #if USETOOLHELP
  89.     InterruptUnRegister (NULL);
  90.     FreeProcInstance (procInst);
  91. #endif
  92. }
  93.  
  94. static void FAR
  95. poll (void)
  96. {}
  97.  
  98. static Ulong FAR
  99. disable (void)
  100. {return (0);}
  101.  
  102. static void FAR
  103. enable (Ulong flags)
  104. {flags=flags;}
  105.  
  106. static void FAR
  107. shell (void)
  108. {
  109.     MsgWPrintf (20, "shell not implemented");
  110. }
  111.  
  112. /* Build file name from parts.
  113.  * path is NULL for "current directory".
  114.  * path is ""   for "root directory".
  115. */
  116. static void FAR
  117. BuildFileName (char *FullName, char *path, char *name, char *ext)
  118. {
  119.     FullName[0] = '\0';
  120.  
  121.     if (path) {
  122.         strcat (FullName, path);
  123.         strcat (FullName, "\\");
  124.     }
  125.     strcat (FullName, name);
  126.     if (ext && ext[0]) {
  127.         strcat (FullName, ".");
  128.         strcat (FullName, ext);
  129.     }
  130. }
  131.  
  132. struct SysDriver NEAR SysDriver = {
  133.     "WINDOWS",
  134.     0,
  135.     NULL,    /* extra */
  136.     init,
  137.     term,
  138.     poll,
  139.     disable,
  140.     enable,
  141.     shell,
  142.     BuildFileName
  143. };
  144.  
  145. extern long FAR PASCAL Fly8WndProc (HWND, Uint, WORD, LONG);
  146. extern int C_MAIN (int argc, char *argv[]);
  147.  
  148. static void
  149. baderr (char *msg)
  150. {
  151.     FILE    *errs;
  152.  
  153.     errs = fopen ("c:\\temp\\fly8w.err", ATMODE);
  154.     if (errs) {
  155.         fprintf (errs, msg);
  156.         fclose (errs);
  157.     }
  158. }
  159.  
  160. /* Procedure called when the application is loaded for the first time
  161. */
  162. static BOOL
  163. WinInit ( HANDLE hInstance, LPSTR  lpszAppName, LPSTR  lpszMessage)
  164. {
  165.     WNDCLASS   pFly8Class;
  166.  
  167. #if 0
  168. /* Check pointer values
  169. */
  170.     if (lpszAppName[0] != '\0'  || lpszMessage != '\0')
  171.         return (FALSE);
  172.  
  173. /* Load strings from resource
  174. */
  175.     LoadString ( hInstance, IDSTR_NAME, (LPSTR)lpszAppName, 10 );
  176.     LoadString ( hInstance, IDSTR_TITLE, (LPSTR)lpszMessage, 15 );
  177. #endif
  178. /* define aspects common to both classes
  179. */
  180.     pFly8Class.style      = CS_OWNDC |
  181.                     CS_BYTEALIGNWINDOW;
  182.     pFly8Class.hCursor    = LoadCursor ( (HINSTANCE)NULL, IDC_ICON );
  183.     pFly8Class.hIcon      = (HICON)NULL;
  184.     pFly8Class.lpszMenuName   = (LPSTR)NULL;
  185.     pFly8Class.hInstance      = hInstance;
  186.     
  187.     pFly8Class.lpszClassName  = (LPSTR)Fly8AppName;
  188.     pFly8Class.hbrBackground  = (HBRUSH) GetStockObject ( BLACK_BRUSH );
  189.     pFly8Class.lpfnWndProc    = (WNDPROC)Fly8WndProc;
  190.  
  191.     if ( !RegisterClass ( &pFly8Class ) ) {
  192. baderr ("Fly8 failed 1\n");
  193.  
  194. /* Initialization failed.
  195.  * Windows will automatically deallocate all allocated memory.
  196. */
  197.         return FALSE;
  198.     }
  199.  
  200.     return TRUE;    /* Initialization succeeded */
  201. }
  202.  
  203. static char    args[1024], *argv[30];
  204.  
  205. int PASCAL
  206. WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine,
  207.     int nCmdShow)
  208. {
  209.     MSG        msg;
  210.     HMENU      hMenu  = NULL;
  211.     char    *p, *q;
  212.     int    i;
  213.  
  214. #if 0
  215. baderr ("Fly8 starting\n");
  216. #endif
  217.     if (!hPrevInstance) {
  218.  
  219. /* Call initialization procedure if this is the first instance
  220. */
  221.         if (!WinInit (hInstance, (LPSTR)Fly8AppName,
  222.                         (LPSTR)Fly8Message)) {
  223. baderr ("Fly8 failed 3\n");
  224.             return FALSE;
  225.         }
  226.     } else {
  227.  
  228. /* Copy data from previous instance
  229. */
  230.         GetInstanceData (hPrevInstance, (BYTE *)Fly8AppName, 10);
  231.         GetInstanceData (hPrevInstance, (BYTE *)Fly8Message, 15);
  232.     }
  233.     
  234.     Fly8Instance = hInstance;
  235.  
  236.     for (i = 0; i < 30; ++i)
  237.         argv[i] = NULL;
  238.     argv[0] = Fly8AppName;
  239.     strcpy (args, lpszCmdLine);
  240.     q = args + strlen (args);
  241.     for ( i = 1, p = args; p < q && *p && i < 30; ++p ) {
  242.         if (*p != ' ') {
  243.             argv[i] = p;
  244.             ++i;
  245.             for (; p < q && *p && i < 30; ++p)
  246.                 if (*p == ' ') {
  247.                     *p = '\0';
  248.                     break;
  249.                 }
  250.         }
  251.     }
  252.  
  253.     C_MAIN (i, argv);    /* pass control to Fly8 */    
  254.  
  255.     return ((int)msg.wParam);
  256. }
  257.